This project analyzes the state of South Florida COVID-19 vaccinations. All data is provided by the Center for Disease Control (CDC).

Updated: 8/6/2021

Data Source: https://data.cdc.gov/Vaccinations/COVID-19-Vaccinations-in-the-United-States-County/8xkx-amqh

Install Libraries

#install.packages("tidyverse")
#install.packages("dplyr")
#install.packages("plotly")

Load Libraries

library(tidyverse)
library(ggplot2)
library(dplyr) 
library(plotly)

CSV Files

# Covid vaccine data
us_covid_vaccination_csv <- "COVID-19_Vaccinations_in_the_United_States_County.csv"

# Covid cases and deaths data
us_covid_cases_and_deaths_csv <- "United_States_COVID-19_Cases_and_Deaths_by_State_over_Time.csv"

# Florida county deaths data
florida_county_deaths_csv <- "COVID-19_Deaths_FL_County.csv"

Import Data

# Vaccination Data
# importing the data
vaccData <- read_csv(covid_vaccination_csv) 
Rows: 751336 Columns: 27
-- Column specification ---------------------------------------------------------------------------------------------------------------
Delimiter: ","
chr  (9): Date, FIPS, Recip_County, Recip_State, SVI_CTGY, Series_Complete_Pop_Pct_SVI, Series_Complete_12PlusPop_Pct_SVI, Series_C...
dbl (18): MMWR_week, Series_Complete_Pop_Pct, Series_Complete_Yes, Series_Complete_12Plus, Series_Complete_12PlusPop_Pct, Series_Co...

i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.
vaccData$Date <- as.Date(vaccData$Date, format = "%m/%d/%Y")  #set date column to date

# arranging the data to show chronologically 
vaccData %>% arrange(Date)
# Covid-19 Case Data
# Importing the data
covidCases <- read_csv(us_covid_cases_and_deaths_csv)
Rows: 33240 Columns: 15
-- Column specification ---------------------------------------------------------------------------------------------------------------
Delimiter: ","
chr  (5): submission_date, state, created_at, consent_cases, consent_deaths
dbl (10): tot_cases, conf_cases, prob_cases, new_case, pnew_case, tot_death, conf_death, prob_death, new_death, pnew_death

i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.
# set date column to date
covidCases$submission_date <- as.Date(covidCases$submission_date, format = "%m/%d/%Y")  

# Renaming columns for readability
covidCases$Date <- covidCases$submission_date
covidCases$`New Cases` <- covidCases$new_case
covidCases$`New Deaths` <- covidCases$new_death

# arranging the data to show chronologically 
covidCases %>% arrange(submission_date)
# FL County Covid Death Data 
# Importing the data
covidCountyFL <- read_csv(florida_county_deaths_csv)
Rows: 67 Columns: 8
-- Column specification ---------------------------------------------------------------------------------------------------------------
Delimiter: ","
chr (5): Date, State, County name, Urban Rural Code, Footnote
dbl (1): FIPS County Code

i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.
# set date column to date
covidCountyFL$Date <- as.Date(covidCountyFL$Date, format = "%m/%d/%y")

# arranging the data to show chronologically 
covidCountyFL %>% arrange(Date)

Data Preparation

# US Daily Vaccinations
# New dataframea of total US daily vaccinations and percentage 
usVacTot <- aggregate(Series_Complete_Yes ~ Date, data = vaccData, sum) 
usVacTotPct <- aggregate(Series_Complete_Pop_Pct ~ Date, data = vaccData, mean) 

usVac12 <- aggregate(Series_Complete_12Plus ~ Date, data = vaccData, sum)  
usVac12Pct <- aggregate(Series_Complete_12PlusPop_Pct ~ Date, data = vaccData, mean)  

usVac18 <- aggregate(Series_Complete_18Plus ~ Date, data = vaccData, sum)   
usVac18Pct <- aggregate(Series_Complete_18PlusPop_Pct ~ Date, data = vaccData, mean)   

usVac65 <- aggregate(Series_Complete_65Plus ~ Date, data = vaccData, sum)   
usVac65Pct <- aggregate(Series_Complete_65PlusPop_Pct ~ Date, data = vaccData, mean)   
# Merging the dataframes into one total us daily vaccination rates
usVaccs <- merge(merge(merge(usVacTot, usVac12, by = "Date"), 
                       usVac18, by = "Date"), 
                 usVac65, by = "Date")
usVaccs
# Florida Daily Vaccinations
# filtering for only FL data
vaccFL <- (filter(vaccData, Recip_State == 'FL')) %>%                      
  
  # selecting useful columns
    subset(select = c(Date, Recip_State, Series_Complete_12Plus, Series_Complete_12PlusPop_Pct, 
                      Series_Complete_18Plus, Series_Complete_18PlusPop_Pct, 
                      Series_Complete_65Plus, Series_Complete_65PlusPop_Pct)) %>%  
  # arranging the data to show chronologically
  arrange(Date)                                                             

vaccFL
# US Daily Covid
# New dataframe of total US daily new cases and deaths 
usCases <- aggregate(`New Cases` ~ Date, data = covidCases, sum)    # daily total new cases
usDeaths <- aggregate(`New Deaths` ~ Date, data = covidCases, sum)  # daily deaths

usCovid <- merge(usCases, usDeaths, by = "Date")
usCovid
# Florida Daily Covid-19
# Filter for only FL data
covidFL <- filter(covidCases, state == 'FL') %>%  
  
  # selecting useful columns
    subset(select = c(Date, `New Cases`, `New Deaths`)) %>%   
  
  # arranging the data to show chronologically
  arrange(Date)                                                             

covidFL
# Broward County Vaccination Data
# filter for only broward vaccine 
BrowardVac <- filter(vaccData, Recip_County  == 'Broward County') %>%
  
  # selecting useful columns
    subset(select = c(Date, Series_Complete_Yes, Series_Complete_12Plus, Series_Complete_12PlusPop_Pct, 
                      Series_Complete_18Plus, Series_Complete_18PlusPop_Pct, 
                      Series_Complete_65Plus, Series_Complete_65PlusPop_Pct)) %>%
  
  # arranging the data to show chronologically
    arrange(Date) 

BrowardVac
# South Florida Counties Covid-19 Deaths
# Filter for certain FL countries
southFLDeaths = filter(covidCountyFL, `County name` == 'Miami-Dade County' | `County name` == 'Broward County'| `County name` == 'Palm Beach County') %>%
  
  # selecting useful columns
    subset(select = c(Date, `County name`, `Deaths involving COVID-19`, `Deaths from All Causes`)) %>%
  
  # arranging the data to show chronologically
    arrange(Date)                                                             
  
southFLDeaths
# Miami Vaccination data
# filtering for only FL data
miamiVacc <- (filter(vaccData, Recip_County == "Miami-Dade County")) %>%                      
  
  # selecting useful columns
    subset(select = c(Date, Series_Complete_12Plus, Series_Complete_12PlusPop_Pct, 
                      Series_Complete_18Plus, Series_Complete_18PlusPop_Pct, 
                      Series_Complete_65Plus, Series_Complete_65PlusPop_Pct)) %>%  
  # arranging the data to show chronologically
  arrange(Date)                                                             

miamiVacc

Data Analytics

Covid-19 Case Data

Bar Plot: New Cases in US vs. Date

# Kelly Rivera
usCaseGraph <- ggplot(mapping = aes(x = `Date`, 
                                    y = `New Cases`/1000, 
                                    color = `New Cases`, 
                                    text = paste("<br>Date:", Date,
                                                 "<br>New Cases:", `New Cases`/1000))) +
  
  geom_col(data = usCovid, show.legend = FALSE) +
  scale_x_date(date_labels = "%b %Y") +
  labs(title = "United States: Daily New Covid Cases",
       subtitle = "Source: CDC",
       x = "Date",
       y = "Number of Cases (thousands)")

ggplotly(usCaseGraph, tooltip = c("text"))

US New Cases Line Graph

# Amanda Ibarra
USCases<-ggplot(data=usCovid, aes(x= `Date`, y= `New Cases`)) +
  geom_line()+
  geom_point(size = 1)+ labs(title = "New Cases in United States",
         x = "Date",
         y = "New Cases",
         subtitle = "Source: CDC") +
  scale_colour_discrete("County")

ggplotly(USCases)

Bar Plot: New Deaths in US vs. Date

# Kelly Rivera
usDeathsGraph <- ggplot(mapping = aes(x = `Date`, 
                                    y = `New Deaths`, 
                                    color = `New Deaths`, 
                                    text = paste("<br>Date:", Date,
                                                 "<br>New Deaths:", `New Deaths`))) +
  
  geom_col(data = usCovid, show.legend = FALSE) +
  scale_x_date(date_labels = "%b %Y") +
  labs(title = "United States: Daily New Covid Deaths",
       subtitle = "Source: CDC",
       x = "Date",
       y = "Number of Deaths")

newUsDeathsGraph <- usDeathsGraph+scale_color_gradient(low="firebrick4", high="red") # changing the gradient colors from defult blue

ggplotly(newUsDeathsGraph, tooltip = c("text"))

Line Plot: New Cases in FL vs. Date

# Rachel Tuffy
graph1 <- ggplot(data = covidFL, mapping = aes(y = `New Cases`/1000, x = `Date`)) +
  geom_smooth(method = "loess", type = "scatter") +
  geom_line() +
  scale_x_date(date_labels = "%b %Y") +
  labs(title = "New Cases in FL by Date",
       x = "Date",
       y = "New Cases (thousands)")
Ignoring unknown parameters: type
ggplotly(graph1)
`geom_smooth()` using formula 'y ~ x'

Line Plot: New Cases in FL vs. Date

# Rachel Tuffy
graph1 <- ggplot(data = covidFL, mapping = aes(y = `New Cases`/1000, x = `Date`)) +
  geom_smooth(method = "loess", type = "scatter") +
  geom_line() +
  scale_x_date(date_labels = "%b %Y") +
  labs(title = "New Cases in FL by Date",
       x = "Date",
       y = "New Cases (thousands)")
Ignoring unknown parameters: type
ggplotly(graph1)
`geom_smooth()` using formula 'y ~ x'

Bar Plot: New Cases in FL vs. Date

# Kelly Rivera
flCaseGraph <- ggplot(mapping = aes(x = `Date`, 
                                    y = `New Cases`/1000, 
                                    color = `New Cases`, 
                                    text = paste("<br>Date:", Date,
                                                 "<br>New Cases:", `New Cases`/1000))) +
  
  geom_col(data = covidFL, show.legend = FALSE) +
  scale_x_date(date_labels = "%b %Y") +
  labs(title = "Florida: Daily New Covid Cases",
       subtitle = "Source: CDC",
       x = "Date",
       y = "Number of Cases (thousands)")

ggplotly(flCaseGraph, tooltip = c("text"))

Line Plot: New Deaths in FL vs. Date

# Kelly Rivera
flDeathsGraph <- ggplot(mapping = aes(x = `Date`, 
                                    y = `New Deaths`, 
                                    color = `New Deaths`, 
                                    text = paste("<br>Date:", Date,
                                                 "<br>New Deaths:", `New Deaths`))) +
  
  geom_col(data = covidFL, show.legend = FALSE) +
  scale_x_date(date_labels = "%b %Y") +
  labs(title = "Florida: Daily New Covid Deaths",
       subtitle = "Source: CDC",
       x = "Date",
       y = "Number of Deaths")

newFLDeathsGraph <- flDeathsGraph+scale_color_gradient(low="firebrick4", high="red") # changing the gradient colors from default blue

ggplotly(newFLDeathsGraph, tooltip = c("text"))

Vaccination Data

Barplot: Percenatge of US vaccinations by Age Group

# Kelly Rivera
usCompSeriesPerc <- ggplot(mapping = aes(x = Date,
                                      y = Series_Complete_Yes)) + 
                  geom_col(data = usVaccs) +
                  scale_x_date(date_labels = "%b %Y") +
                  labs(title = "US Fully Vaccationate Percentage",
                         x = "Date",
                         y = "Series Complete Percentage (%)",
                         subtitle = "Source: CDC") +
                  scale_colour_discrete("County")

ggplotly(usCompSeriesPerc)

Barplot: Numbers of US vaccinations by Age Group

# Kelly Rivera
usCompSeries <- ggplot(mapping = aes(x = Date)) + 
                  geom_line(data = usVaccs, mapping = aes(y = Series_Complete_12Plus/1000000), color = "blue") +
                  geom_line(data = usVaccs, mapping = aes(y = Series_Complete_18Plus/1000000), color = "red") +
                  geom_line(data = usVaccs, mapping = aes(y = Series_Complete_65Plus/1000000), color = "yellow") +
                  scale_x_date(date_labels = "%b %Y") +
                  labs(title = "US Fully Vaccationate",
                         x = "Date",
                         y = "Number of Series Complete (millions)",
                         subtitle = "Source: CDC") +
                  scale_colour_discrete("County")

ggplotly(usCompSeries)

Barplot: Percenatge of FL vaccinations by Age Group

Barplot: Numbers of FL vaccinations by Age Group

# Kelly Rivera
flCompSeries <- ggplot(mapping = aes(x = Date)) + 
                  geom_line(data = vaccFL, mapping = aes(y = Series_Complete_12Plus), color = "blue") +
                  geom_line(data = vaccFL, mapping = aes(y = Series_Complete_18Plus), color = "red") +
                  geom_line(data = vaccFL, mapping = aes(y = Series_Complete_65Plus), color = "yellow") +
                  scale_x_date(date_labels = "%b %Y") +
                  labs(title = "US Fully Vaccationate",
                         x = "Date",
                         y = "Number of Series Complete (millions)",
                         subtitle = "Source: CDC") +
                  scale_colour_discrete("County")

ggplotly(flCompSeries)

Bar plot: Broward Vaccination Population

# Amanda Ibarra
BrowardFullyVac<-ggplot(BrowardVac, aes(x=Date, y=Series_Complete_Yes)) + 
  geom_bar(stat = "identity", color= "orange") + scale_x_date(date_labels = "%b %Y") +
  labs(title = "Broward County: Fully Vaccinated Population",
         x = "Date",
         y = "Series Complete",
         subtitle = "Source: CDC") +
  scale_colour_discrete("County")
ggplotly(BrowardFullyVac)

Bar plot: Broward Vaccination 12 Plus

# Amanda Ibarra
Broward12PlusVac <-ggplot(BrowardVac, aes(x=Date, y=Series_Complete_12Plus)) + 
  geom_bar(stat = "identity", color= "red") + scale_x_date(date_labels = "%b %Y") +
  labs(title = "Broward County: Fully Vaccinated 12 Plus Population",
         x = "Date",
         y = "Series Complete",
         subtitle = "Source: CDC") +
  scale_colour_discrete("County")
ggplotly(Broward12PlusVac)

Bar plot: Broward Vaccination 18 Plus

# Amanda Ibarra
Broward18PlusVac <-ggplot(BrowardVac, aes(x=Date, y=Series_Complete_18Plus)) + 
  geom_bar(stat = "identity", color= "blue") + scale_x_date(date_labels = "%b %Y") +
  labs(title = "Broward County: Fully Vaccinated 18 Plus Population",
         x = "Date",
         y = "Series Complete",
         subtitle = "Source: CDC") +
  scale_colour_discrete("County")
ggplotly(Broward18PlusVac)

Bar plot: Broward Vaccination 65 Plus

# Amanda Ibarra
Broward65PlusVac <-ggplot(BrowardVac, aes(x=Date, y=Series_Complete_65Plus)) + 
  geom_bar(stat = "identity", color= "orange") +  scale_x_date(date_labels = "%b %Y") +
  labs(title = "Broward County: Fully Vaccinated 65 Plus Population",
         x = "Date",
         y = "Series Complete",
         subtitle = "Source: CDC") +
  scale_colour_discrete("County")
ggplotly(Broward65PlusVac)

Bar Plot: Covid Deaths for SoFL counties

# Manuela Montoya
ggplot(southFLDeaths,mapping = aes(y= `Deaths involving COVID-19`/1000 ,x =`County name`, fill = `County name`)) +
  geom_bar(stat = 'identity', show.legend = FALSE) +
  labs(title = "South Florida: Deaths Involving COVID-19",
       y = "Number of Deaths (thousands)", x = 'County Name ')

Miami vaccinations Age 12+

# Manuela Montoya
Age12 <-ggplot(miamiVacc, mapping = aes(y= Series_Complete_12Plus, x = Date)) +
  geom_bar(stat = 'identity', color = "blue") +
  scale_x_date(date_labels = "%b %Y") +
  labs(title = "Miami Vaccination Numbers: Age 12+",
       y = "Vaccination Numbers",
       x = 'Date')

ggplotly(Age12)

Miami vaccinations Age 18+

# Manuela Montoya
Age18 <-ggplot(miamiVacc, mapping = aes(y= Series_Complete_18Plus, x = Date)) +
  geom_bar(stat = 'identity', color = "red") +
  scale_x_date(date_labels = "%b %Y") +
  labs(title = "Miami Vaccination Numbers: Age 18+",
       y = "Vaccination Numbers",
       x = 'Date')

ggplotly(Age18)

Miami vaccinations Age 65+

# Manuela Montoya
Age65 <- ggplot(miamiVacc, mapping = aes(y= Series_Complete_65Plus, x = Date)) +
  geom_bar(stat = 'identity', color = 'orange') +
  scale_x_date(date_labels = "%b %Y") +
  labs(title = "Miami Vaccination Numbers: Age 65+",
       y = "Vaccination Numbers",
       x = 'Date')

ggplotly(Age65)
LS0tDQp0aXRsZTogIkNvdmlkLTE5IEFuYXlsc2lzIg0KYXV0aG9yOiANCi0gIktlbGx5IFJpdmVyYSwgUmFjaGVsIFR1ZmZ5LCBNYW51ZWxhIE1vbnRveWEsIEFtYW5kYSBJYmFycmEiDQotICJEci4gU2VhbiBNb25kZXNpcmUiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KVGhpcyBwcm9qZWN0IGFuYWx5emVzIHRoZSBzdGF0ZSBvZiBTb3V0aCBGbG9yaWRhIENPVklELTE5IHZhY2NpbmF0aW9ucy4gQWxsIGRhdGEgaXMgcHJvdmlkZWQgYnkgdGhlIENlbnRlciBmb3IgRGlzZWFzZSBDb250cm9sIChDREMpLg0KDQpVcGRhdGVkOiA4LzYvMjAyMQ0KDQpEYXRhIFNvdXJjZTogaHR0cHM6Ly9kYXRhLmNkYy5nb3YvVmFjY2luYXRpb25zL0NPVklELTE5LVZhY2NpbmF0aW9ucy1pbi10aGUtVW5pdGVkLVN0YXRlcy1Db3VudHkvOHhreC1hbXFoDQoNCiMgSW5zdGFsbCBMaWJyYXJpZXMNCmBgYHtyfQ0KI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQojaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQ0KI2luc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQpgYGANCg0KIyBMb2FkIExpYnJhcmllcw0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpIA0KbGlicmFyeShwbG90bHkpDQpgYGANCg0KIyBDU1YgRmlsZXMNCmBgYHtyfQ0KIyBDb3ZpZCB2YWNjaW5lIGRhdGENCnVzX2NvdmlkX3ZhY2NpbmF0aW9uX2NzdiA8LSAiQ09WSUQtMTlfVmFjY2luYXRpb25zX2luX3RoZV9Vbml0ZWRfU3RhdGVzX0NvdW50eS5jc3YiDQoNCiMgQ292aWQgY2FzZXMgYW5kIGRlYXRocyBkYXRhDQp1c19jb3ZpZF9jYXNlc19hbmRfZGVhdGhzX2NzdiA8LSAiVW5pdGVkX1N0YXRlc19DT1ZJRC0xOV9DYXNlc19hbmRfRGVhdGhzX2J5X1N0YXRlX292ZXJfVGltZS5jc3YiDQoNCiMgRmxvcmlkYSBjb3VudHkgZGVhdGhzIGRhdGENCmZsb3JpZGFfY291bnR5X2RlYXRoc19jc3YgPC0gIkNPVklELTE5X0RlYXRoc19GTF9Db3VudHkuY3N2Ig0KYGBgDQoNCg0KIyBJbXBvcnQgRGF0YQ0KYGBge3J9DQojIFZhY2NpbmF0aW9uIERhdGENCiMgaW1wb3J0aW5nIHRoZSBkYXRhDQp2YWNjRGF0YSA8LSByZWFkX2Nzdihjb3ZpZF92YWNjaW5hdGlvbl9jc3YpIA0KdmFjY0RhdGEkRGF0ZSA8LSBhcy5EYXRlKHZhY2NEYXRhJERhdGUsIGZvcm1hdCA9ICIlbS8lZC8lWSIpICAjc2V0IGRhdGUgY29sdW1uIHRvIGRhdGUNCg0KIyBhcnJhbmdpbmcgdGhlIGRhdGEgdG8gc2hvdyBjaHJvbm9sb2dpY2FsbHkgDQp2YWNjRGF0YSAlPiUgYXJyYW5nZShEYXRlKQ0KYGBgDQoNCmBgYHtyfQ0KIyBDb3ZpZC0xOSBDYXNlIERhdGENCiMgSW1wb3J0aW5nIHRoZSBkYXRhDQpjb3ZpZENhc2VzIDwtIHJlYWRfY3N2KHVzX2NvdmlkX2Nhc2VzX2FuZF9kZWF0aHNfY3N2KQ0KDQojIHNldCBkYXRlIGNvbHVtbiB0byBkYXRlDQpjb3ZpZENhc2VzJHN1Ym1pc3Npb25fZGF0ZSA8LSBhcy5EYXRlKGNvdmlkQ2FzZXMkc3VibWlzc2lvbl9kYXRlLCBmb3JtYXQgPSAiJW0vJWQvJVkiKSAgDQoNCiMgUmVuYW1pbmcgY29sdW1ucyBmb3IgcmVhZGFiaWxpdHkNCmNvdmlkQ2FzZXMkRGF0ZSA8LSBjb3ZpZENhc2VzJHN1Ym1pc3Npb25fZGF0ZQ0KY292aWRDYXNlcyRgTmV3IENhc2VzYCA8LSBjb3ZpZENhc2VzJG5ld19jYXNlDQpjb3ZpZENhc2VzJGBOZXcgRGVhdGhzYCA8LSBjb3ZpZENhc2VzJG5ld19kZWF0aA0KDQojIGFycmFuZ2luZyB0aGUgZGF0YSB0byBzaG93IGNocm9ub2xvZ2ljYWxseSANCmNvdmlkQ2FzZXMgJT4lIGFycmFuZ2Uoc3VibWlzc2lvbl9kYXRlKQ0KYGBgDQoNCg0KYGBge3J9DQojIEZMIENvdW50eSBDb3ZpZCBEZWF0aCBEYXRhIA0KIyBJbXBvcnRpbmcgdGhlIGRhdGENCmNvdmlkQ291bnR5RkwgPC0gcmVhZF9jc3YoZmxvcmlkYV9jb3VudHlfZGVhdGhzX2NzdikNCg0KIyBzZXQgZGF0ZSBjb2x1bW4gdG8gZGF0ZQ0KY292aWRDb3VudHlGTCREYXRlIDwtIGFzLkRhdGUoY292aWRDb3VudHlGTCREYXRlLCBmb3JtYXQgPSAiJW0vJWQvJXkiKQ0KDQojIGFycmFuZ2luZyB0aGUgZGF0YSB0byBzaG93IGNocm9ub2xvZ2ljYWxseSANCmNvdmlkQ291bnR5RkwgJT4lIGFycmFuZ2UoRGF0ZSkNCmBgYA0KDQojIERhdGEgUHJlcGFyYXRpb24NCmBgYHtyfQ0KIyBVUyBEYWlseSBWYWNjaW5hdGlvbnMNCiMgTmV3IGRhdGFmcmFtZWEgb2YgdG90YWwgVVMgZGFpbHkgdmFjY2luYXRpb25zIGFuZCBwZXJjZW50YWdlIA0KdXNWYWNUb3QgPC0gYWdncmVnYXRlKFNlcmllc19Db21wbGV0ZV9ZZXMgfiBEYXRlLCBkYXRhID0gdmFjY0RhdGEsIHN1bSkgDQp1c1ZhY1RvdFBjdCA8LSBhZ2dyZWdhdGUoU2VyaWVzX0NvbXBsZXRlX1BvcF9QY3QgfiBEYXRlLCBkYXRhID0gdmFjY0RhdGEsIG1lYW4pIA0KDQp1c1ZhYzEyIDwtIGFnZ3JlZ2F0ZShTZXJpZXNfQ29tcGxldGVfMTJQbHVzIH4gRGF0ZSwgZGF0YSA9IHZhY2NEYXRhLCBzdW0pICANCnVzVmFjMTJQY3QgPC0gYWdncmVnYXRlKFNlcmllc19Db21wbGV0ZV8xMlBsdXNQb3BfUGN0IH4gRGF0ZSwgZGF0YSA9IHZhY2NEYXRhLCBtZWFuKSAgDQoNCnVzVmFjMTggPC0gYWdncmVnYXRlKFNlcmllc19Db21wbGV0ZV8xOFBsdXMgfiBEYXRlLCBkYXRhID0gdmFjY0RhdGEsIHN1bSkgICANCnVzVmFjMThQY3QgPC0gYWdncmVnYXRlKFNlcmllc19Db21wbGV0ZV8xOFBsdXNQb3BfUGN0IH4gRGF0ZSwgZGF0YSA9IHZhY2NEYXRhLCBtZWFuKSAgIA0KDQp1c1ZhYzY1IDwtIGFnZ3JlZ2F0ZShTZXJpZXNfQ29tcGxldGVfNjVQbHVzIH4gRGF0ZSwgZGF0YSA9IHZhY2NEYXRhLCBzdW0pICAgDQp1c1ZhYzY1UGN0IDwtIGFnZ3JlZ2F0ZShTZXJpZXNfQ29tcGxldGVfNjVQbHVzUG9wX1BjdCB+IERhdGUsIGRhdGEgPSB2YWNjRGF0YSwgbWVhbikgICANCg0KYGBgDQoNCmBgYHtyfQ0KIyBNZXJnaW5nIHRoZSBkYXRhZnJhbWVzIGludG8gb25lIHRvdGFsIHVzIGRhaWx5IHZhY2NpbmF0aW9uIHJhdGVzDQp1c1ZhY2NzIDwtIG1lcmdlKG1lcmdlKG1lcmdlKHVzVmFjVG90LCB1c1ZhYzEyLCBieSA9ICJEYXRlIiksIA0KICAgICAgICAgICAgICAgICAgICAgICB1c1ZhYzE4LCBieSA9ICJEYXRlIiksIA0KICAgICAgICAgICAgICAgICB1c1ZhYzY1LCBieSA9ICJEYXRlIikNCnVzVmFjY3MNCmBgYA0KDQpgYGB7cn0NCiMgRmxvcmlkYSBEYWlseSBWYWNjaW5hdGlvbnMNCiMgZmlsdGVyaW5nIGZvciBvbmx5IEZMIGRhdGENCnZhY2NGTCA8LSAoZmlsdGVyKHZhY2NEYXRhLCBSZWNpcF9TdGF0ZSA9PSAnRkwnKSkgJT4lICAgICAgICAgICAgICAgICAgICAgIA0KICANCiAgIyBzZWxlY3RpbmcgdXNlZnVsIGNvbHVtbnMNCiAgICBzdWJzZXQoc2VsZWN0ID0gYyhEYXRlLCBSZWNpcF9TdGF0ZSwgU2VyaWVzX0NvbXBsZXRlXzEyUGx1cywgU2VyaWVzX0NvbXBsZXRlXzEyUGx1c1BvcF9QY3QsIA0KICAgICAgICAgICAgICAgICAgICAgIFNlcmllc19Db21wbGV0ZV8xOFBsdXMsIFNlcmllc19Db21wbGV0ZV8xOFBsdXNQb3BfUGN0LCANCiAgICAgICAgICAgICAgICAgICAgICBTZXJpZXNfQ29tcGxldGVfNjVQbHVzLCBTZXJpZXNfQ29tcGxldGVfNjVQbHVzUG9wX1BjdCkpICU+JSAgDQogICMgYXJyYW5naW5nIHRoZSBkYXRhIHRvIHNob3cgY2hyb25vbG9naWNhbGx5DQogIGFycmFuZ2UoRGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCnZhY2NGTA0KYGBgDQoNCmBgYHtyfQ0KIyBVUyBEYWlseSBDb3ZpZA0KIyBOZXcgZGF0YWZyYW1lIG9mIHRvdGFsIFVTIGRhaWx5IG5ldyBjYXNlcyBhbmQgZGVhdGhzIA0KdXNDYXNlcyA8LSBhZ2dyZWdhdGUoYE5ldyBDYXNlc2AgfiBEYXRlLCBkYXRhID0gY292aWRDYXNlcywgc3VtKSAgICAjIGRhaWx5IHRvdGFsIG5ldyBjYXNlcw0KdXNEZWF0aHMgPC0gYWdncmVnYXRlKGBOZXcgRGVhdGhzYCB+IERhdGUsIGRhdGEgPSBjb3ZpZENhc2VzLCBzdW0pICAjIGRhaWx5IGRlYXRocw0KDQp1c0NvdmlkIDwtIG1lcmdlKHVzQ2FzZXMsIHVzRGVhdGhzLCBieSA9ICJEYXRlIikNCnVzQ292aWQNCmBgYA0KDQpgYGB7cn0NCiMgRmxvcmlkYSBEYWlseSBDb3ZpZC0xOQ0KIyBGaWx0ZXIgZm9yIG9ubHkgRkwgZGF0YQ0KY292aWRGTCA8LSBmaWx0ZXIoY292aWRDYXNlcywgc3RhdGUgPT0gJ0ZMJykgJT4lICANCiAgDQogICMgc2VsZWN0aW5nIHVzZWZ1bCBjb2x1bW5zDQogICAgc3Vic2V0KHNlbGVjdCA9IGMoRGF0ZSwgYE5ldyBDYXNlc2AsIGBOZXcgRGVhdGhzYCkpICU+JSAgIA0KICANCiAgIyBhcnJhbmdpbmcgdGhlIGRhdGEgdG8gc2hvdyBjaHJvbm9sb2dpY2FsbHkNCiAgYXJyYW5nZShEYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KY292aWRGTA0KYGBgDQoNCmBgYHtyfQ0KIyBCcm93YXJkIENvdW50eSBWYWNjaW5hdGlvbiBEYXRhDQojIGZpbHRlciBmb3Igb25seSBicm93YXJkIHZhY2NpbmUgDQpCcm93YXJkVmFjIDwtIGZpbHRlcih2YWNjRGF0YSwgUmVjaXBfQ291bnR5ICA9PSAnQnJvd2FyZCBDb3VudHknKSAlPiUNCiAgDQogICMgc2VsZWN0aW5nIHVzZWZ1bCBjb2x1bW5zDQogICAgc3Vic2V0KHNlbGVjdCA9IGMoRGF0ZSwgU2VyaWVzX0NvbXBsZXRlX1llcywgU2VyaWVzX0NvbXBsZXRlXzEyUGx1cywgU2VyaWVzX0NvbXBsZXRlXzEyUGx1c1BvcF9QY3QsIA0KICAgICAgICAgICAgICAgICAgICAgIFNlcmllc19Db21wbGV0ZV8xOFBsdXMsIFNlcmllc19Db21wbGV0ZV8xOFBsdXNQb3BfUGN0LCANCiAgICAgICAgICAgICAgICAgICAgICBTZXJpZXNfQ29tcGxldGVfNjVQbHVzLCBTZXJpZXNfQ29tcGxldGVfNjVQbHVzUG9wX1BjdCkpICU+JQ0KICANCiAgIyBhcnJhbmdpbmcgdGhlIGRhdGEgdG8gc2hvdyBjaHJvbm9sb2dpY2FsbHkNCiAgICBhcnJhbmdlKERhdGUpIA0KDQpCcm93YXJkVmFjDQpgYGANCg0KDQpgYGB7cn0NCiMgU291dGggRmxvcmlkYSBDb3VudGllcyBDb3ZpZC0xOSBEZWF0aHMNCiMgRmlsdGVyIGZvciBjZXJ0YWluIEZMIGNvdW50cmllcw0Kc291dGhGTERlYXRocyA9IGZpbHRlcihjb3ZpZENvdW50eUZMLCBgQ291bnR5IG5hbWVgID09ICdNaWFtaS1EYWRlIENvdW50eScgfCBgQ291bnR5IG5hbWVgID09ICdCcm93YXJkIENvdW50eSd8IGBDb3VudHkgbmFtZWAgPT0gJ1BhbG0gQmVhY2ggQ291bnR5JykgJT4lDQogIA0KICAjIHNlbGVjdGluZyB1c2VmdWwgY29sdW1ucw0KICAgIHN1YnNldChzZWxlY3QgPSBjKERhdGUsIGBDb3VudHkgbmFtZWAsIGBEZWF0aHMgaW52b2x2aW5nIENPVklELTE5YCwgYERlYXRocyBmcm9tIEFsbCBDYXVzZXNgKSkgJT4lDQogIA0KICAjIGFycmFuZ2luZyB0aGUgZGF0YSB0byBzaG93IGNocm9ub2xvZ2ljYWxseQ0KICAgIGFycmFuZ2UoRGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIA0Kc291dGhGTERlYXRocw0KYGBgDQoNCg0KYGBge3J9DQojIE1pYW1pIFZhY2NpbmF0aW9uIGRhdGENCiMgZmlsdGVyaW5nIGZvciBvbmx5IEZMIGRhdGENCm1pYW1pVmFjYyA8LSAoZmlsdGVyKHZhY2NEYXRhLCBSZWNpcF9Db3VudHkgPT0gIk1pYW1pLURhZGUgQ291bnR5IikpICU+JSAgICAgICAgICAgICAgICAgICAgICANCiAgDQogICMgc2VsZWN0aW5nIHVzZWZ1bCBjb2x1bW5zDQogICAgc3Vic2V0KHNlbGVjdCA9IGMoRGF0ZSwgU2VyaWVzX0NvbXBsZXRlXzEyUGx1cywgU2VyaWVzX0NvbXBsZXRlXzEyUGx1c1BvcF9QY3QsIA0KICAgICAgICAgICAgICAgICAgICAgIFNlcmllc19Db21wbGV0ZV8xOFBsdXMsIFNlcmllc19Db21wbGV0ZV8xOFBsdXNQb3BfUGN0LCANCiAgICAgICAgICAgICAgICAgICAgICBTZXJpZXNfQ29tcGxldGVfNjVQbHVzLCBTZXJpZXNfQ29tcGxldGVfNjVQbHVzUG9wX1BjdCkpICU+JSAgDQogICMgYXJyYW5naW5nIHRoZSBkYXRhIHRvIHNob3cgY2hyb25vbG9naWNhbGx5DQogIGFycmFuZ2UoRGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCm1pYW1pVmFjYw0KYGBgDQoNCg0KIyBEYXRhIEFuYWx5dGljcyANCg0KQ292aWQtMTkgQ2FzZSBEYXRhDQoNCiMjIEJhciBQbG90OiBOZXcgQ2FzZXMgaW4gVVMgdnMuIERhdGUNCmBgYHtyfQ0KIyBLZWxseSBSaXZlcmENCnVzQ2FzZUdyYXBoIDwtIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBgRGF0ZWAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGBOZXcgQ2FzZXNgLzEwMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBgTmV3IENhc2VzYCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUoIjxicj5EYXRlOiIsIERhdGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5OZXcgQ2FzZXM6IiwgYE5ldyBDYXNlc2AvMTAwMCkpKSArDQogIA0KICBnZW9tX2NvbChkYXRhID0gdXNDb3ZpZCwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWIgJVkiKSArDQogIGxhYnModGl0bGUgPSAiVW5pdGVkIFN0YXRlczogRGFpbHkgTmV3IENvdmlkIENhc2VzIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJTb3VyY2U6IENEQyIsDQogICAgICAgeCA9ICJEYXRlIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBDYXNlcyAodGhvdXNhbmRzKSIpDQoNCmdncGxvdGx5KHVzQ2FzZUdyYXBoLCB0b29sdGlwID0gYygidGV4dCIpKQ0KYGBgDQoNCiMjIFVTIE5ldyBDYXNlcyBMaW5lIEdyYXBoDQpgYGB7cn0NCiMgQW1hbmRhIEliYXJyYQ0KVVNDYXNlczwtZ2dwbG90KGRhdGE9dXNDb3ZpZCwgYWVzKHg9IGBEYXRlYCwgeT0gYE5ldyBDYXNlc2ApKSArDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KHNpemUgPSAxKSsgbGFicyh0aXRsZSA9ICJOZXcgQ2FzZXMgaW4gVW5pdGVkIFN0YXRlcyIsDQogICAgICAgICB4ID0gIkRhdGUiLA0KICAgICAgICAgeSA9ICJOZXcgQ2FzZXMiLA0KICAgICAgICAgc3VidGl0bGUgPSAiU291cmNlOiBDREMiKSArDQogIHNjYWxlX2NvbG91cl9kaXNjcmV0ZSgiQ291bnR5IikNCg0KZ2dwbG90bHkoVVNDYXNlcykNCmBgYA0KDQojIyBCYXIgUGxvdDogTmV3IERlYXRocyBpbiBVUyB2cy4gRGF0ZQ0KYGBge3J9DQojIEtlbGx5IFJpdmVyYQ0KdXNEZWF0aHNHcmFwaCA8LSBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYERhdGVgLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBgTmV3IERlYXRoc2AsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBgTmV3IERlYXRoc2AsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlKCI8YnI+RGF0ZToiLCBEYXRlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TmV3IERlYXRoczoiLCBgTmV3IERlYXRoc2ApKSkgKw0KICANCiAgZ2VvbV9jb2woZGF0YSA9IHVzQ292aWQsIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfbGFiZWxzID0gIiViICVZIikgKw0KICBsYWJzKHRpdGxlID0gIlVuaXRlZCBTdGF0ZXM6IERhaWx5IE5ldyBDb3ZpZCBEZWF0aHMiLA0KICAgICAgIHN1YnRpdGxlID0gIlNvdXJjZTogQ0RDIiwNCiAgICAgICB4ID0gIkRhdGUiLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIERlYXRocyIpDQoNCm5ld1VzRGVhdGhzR3JhcGggPC0gdXNEZWF0aHNHcmFwaCtzY2FsZV9jb2xvcl9ncmFkaWVudChsb3c9ImZpcmVicmljazQiLCBoaWdoPSJyZWQiKSAjIGNoYW5naW5nIHRoZSBncmFkaWVudCBjb2xvcnMgZnJvbSBkZWZ1bHQgYmx1ZQ0KDQpnZ3Bsb3RseShuZXdVc0RlYXRoc0dyYXBoLCB0b29sdGlwID0gYygidGV4dCIpKQ0KYGBgDQoNCiMjIExpbmUgUGxvdDogTmV3IENhc2VzIGluIEZMIHZzLiBEYXRlIA0KYGBge3J9DQojIFJhY2hlbCBUdWZmeQ0KZ3JhcGgxIDwtIGdncGxvdChkYXRhID0gY292aWRGTCwgbWFwcGluZyA9IGFlcyh5ID0gYE5ldyBDYXNlc2AvMTAwMCwgeCA9IGBEYXRlYCkpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgdHlwZSA9ICJzY2F0dGVyIikgKw0KICBnZW9tX2xpbmUoKSArDQogIHNjYWxlX3hfZGF0ZShkYXRlX2xhYmVscyA9ICIlYiAlWSIpICsNCiAgbGFicyh0aXRsZSA9ICJOZXcgQ2FzZXMgaW4gRkwgYnkgRGF0ZSIsDQogICAgICAgeCA9ICJEYXRlIiwNCiAgICAgICB5ID0gIk5ldyBDYXNlcyAodGhvdXNhbmRzKSIpDQpnZ3Bsb3RseShncmFwaDEpDQpgYGANCg0KIyMgTGluZSBQbG90OiBOZXcgQ2FzZXMgaW4gRkwgdnMuIERhdGUNCmBgYHtyfQ0KIyBSYWNoZWwgVHVmZnkNCmdyYXBoMSA8LSBnZ3Bsb3QoZGF0YSA9IGNvdmlkRkwsIG1hcHBpbmcgPSBhZXMoeSA9IGBOZXcgQ2FzZXNgLzEwMDAsIHggPSBgRGF0ZWApKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHR5cGUgPSAic2NhdHRlciIpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWIgJVkiKSArDQogIGxhYnModGl0bGUgPSAiTmV3IENhc2VzIGluIEZMIGJ5IERhdGUiLA0KICAgICAgIHggPSAiRGF0ZSIsDQogICAgICAgeSA9ICJOZXcgQ2FzZXMgKHRob3VzYW5kcykiKQ0KZ2dwbG90bHkoZ3JhcGgxKQ0KYGBgDQoNCiMjIEJhciBQbG90OiBOZXcgQ2FzZXMgaW4gRkwgdnMuIERhdGUNCmBgYHtyfQ0KIyBLZWxseSBSaXZlcmENCmZsQ2FzZUdyYXBoIDwtIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBgRGF0ZWAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGBOZXcgQ2FzZXNgLzEwMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBgTmV3IENhc2VzYCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUoIjxicj5EYXRlOiIsIERhdGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5OZXcgQ2FzZXM6IiwgYE5ldyBDYXNlc2AvMTAwMCkpKSArDQogIA0KICBnZW9tX2NvbChkYXRhID0gY292aWRGTCwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWIgJVkiKSArDQogIGxhYnModGl0bGUgPSAiRmxvcmlkYTogRGFpbHkgTmV3IENvdmlkIENhc2VzIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJTb3VyY2U6IENEQyIsDQogICAgICAgeCA9ICJEYXRlIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBDYXNlcyAodGhvdXNhbmRzKSIpDQoNCmdncGxvdGx5KGZsQ2FzZUdyYXBoLCB0b29sdGlwID0gYygidGV4dCIpKQ0KYGBgDQoNCiMjIExpbmUgUGxvdDogTmV3IERlYXRocyBpbiBGTCB2cy4gRGF0ZQ0KYGBge3J9DQojIEtlbGx5IFJpdmVyYQ0KZmxEZWF0aHNHcmFwaCA8LSBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYERhdGVgLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBgTmV3IERlYXRoc2AsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBgTmV3IERlYXRoc2AsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlKCI8YnI+RGF0ZToiLCBEYXRlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+TmV3IERlYXRoczoiLCBgTmV3IERlYXRoc2ApKSkgKw0KICANCiAgZ2VvbV9jb2woZGF0YSA9IGNvdmlkRkwsIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfbGFiZWxzID0gIiViICVZIikgKw0KICBsYWJzKHRpdGxlID0gIkZsb3JpZGE6IERhaWx5IE5ldyBDb3ZpZCBEZWF0aHMiLA0KICAgICAgIHN1YnRpdGxlID0gIlNvdXJjZTogQ0RDIiwNCiAgICAgICB4ID0gIkRhdGUiLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIERlYXRocyIpDQoNCm5ld0ZMRGVhdGhzR3JhcGggPC0gZmxEZWF0aHNHcmFwaCtzY2FsZV9jb2xvcl9ncmFkaWVudChsb3c9ImZpcmVicmljazQiLCBoaWdoPSJyZWQiKSAjIGNoYW5naW5nIHRoZSBncmFkaWVudCBjb2xvcnMgZnJvbSBkZWZhdWx0IGJsdWUNCg0KZ2dwbG90bHkobmV3RkxEZWF0aHNHcmFwaCwgdG9vbHRpcCA9IGMoInRleHQiKSkNCmBgYA0KDQpWYWNjaW5hdGlvbiBEYXRhDQoNCiMjIEJhcnBsb3Q6IFBlcmNlbmF0Z2Ugb2YgVVMgdmFjY2luYXRpb25zIGJ5IEFnZSBHcm91cA0KYGBge3J9DQojIEtlbGx5IFJpdmVyYQ0KdXNDb21wU2VyaWVzUGVyYyA8LSBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gRGF0ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IFNlcmllc19Db21wbGV0ZV9ZZXMpKSArIA0KICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woZGF0YSA9IHVzVmFjY3MpICsNCiAgICAgICAgICAgICAgICAgIHNjYWxlX3hfZGF0ZShkYXRlX2xhYmVscyA9ICIlYiAlWSIpICsNCiAgICAgICAgICAgICAgICAgIGxhYnModGl0bGUgPSAiVVMgRnVsbHkgVmFjY2F0aW9uYXRlIFBlcmNlbnRhZ2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAiRGF0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgeSA9ICJTZXJpZXMgQ29tcGxldGUgUGVyY2VudGFnZSAoJSkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIlNvdXJjZTogQ0RDIikgKw0KICAgICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX2Rpc2NyZXRlKCJDb3VudHkiKQ0KDQpnZ3Bsb3RseSh1c0NvbXBTZXJpZXNQZXJjKQ0KYGBgDQoNCiMjIEJhcnBsb3Q6IE51bWJlcnMgb2YgVVMgdmFjY2luYXRpb25zIGJ5IEFnZSBHcm91cA0KYGBge3J9DQojIEtlbGx5IFJpdmVyYQ0KdXNDb21wU2VyaWVzIDwtIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBEYXRlKSkgKyANCiAgICAgICAgICAgICAgICAgIGdlb21fbGluZShkYXRhID0gdXNWYWNjcywgbWFwcGluZyA9IGFlcyh5ID0gU2VyaWVzX0NvbXBsZXRlXzEyUGx1cy8xMDAwMDAwKSwgY29sb3IgPSAiYmx1ZSIpICsNCiAgICAgICAgICAgICAgICAgIGdlb21fbGluZShkYXRhID0gdXNWYWNjcywgbWFwcGluZyA9IGFlcyh5ID0gU2VyaWVzX0NvbXBsZXRlXzE4UGx1cy8xMDAwMDAwKSwgY29sb3IgPSAicmVkIikgKw0KICAgICAgICAgICAgICAgICAgZ2VvbV9saW5lKGRhdGEgPSB1c1ZhY2NzLCBtYXBwaW5nID0gYWVzKHkgPSBTZXJpZXNfQ29tcGxldGVfNjVQbHVzLzEwMDAwMDApLCBjb2xvciA9ICJ5ZWxsb3ciKSArDQogICAgICAgICAgICAgICAgICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWIgJVkiKSArDQogICAgICAgICAgICAgICAgICBsYWJzKHRpdGxlID0gIlVTIEZ1bGx5IFZhY2NhdGlvbmF0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgeCA9ICJEYXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gIk51bWJlciBvZiBTZXJpZXMgQ29tcGxldGUgKG1pbGxpb25zKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiU291cmNlOiBDREMiKSArDQogICAgICAgICAgICAgICAgICBzY2FsZV9jb2xvdXJfZGlzY3JldGUoIkNvdW50eSIpDQoNCmdncGxvdGx5KHVzQ29tcFNlcmllcykNCmBgYA0KDQojIyBCYXJwbG90OiBQZXJjZW5hdGdlIG9mIEZMIHZhY2NpbmF0aW9ucyBieSBBZ2UgR3JvdXANCmBgYHtyfQ0KDQpgYGANCg0KIyMgQmFycGxvdDogTnVtYmVycyBvZiBGTCB2YWNjaW5hdGlvbnMgYnkgQWdlIEdyb3VwDQpgYGB7cn0NCiMgS2VsbHkgUml2ZXJhDQpmbENvbXBTZXJpZXMgPC0gZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IERhdGUpKSArIA0KICAgICAgICAgICAgICAgICAgZ2VvbV9saW5lKGRhdGEgPSB2YWNjRkwsIG1hcHBpbmcgPSBhZXMoeSA9IFNlcmllc19Db21wbGV0ZV8xMlBsdXMpLCBjb2xvciA9ICJibHVlIikgKw0KICAgICAgICAgICAgICAgICAgZ2VvbV9saW5lKGRhdGEgPSB2YWNjRkwsIG1hcHBpbmcgPSBhZXMoeSA9IFNlcmllc19Db21wbGV0ZV8xOFBsdXMpLCBjb2xvciA9ICJyZWQiKSArDQogICAgICAgICAgICAgICAgICBnZW9tX2xpbmUoZGF0YSA9IHZhY2NGTCwgbWFwcGluZyA9IGFlcyh5ID0gU2VyaWVzX0NvbXBsZXRlXzY1UGx1cyksIGNvbG9yID0gInllbGxvdyIpICsNCiAgICAgICAgICAgICAgICAgIHNjYWxlX3hfZGF0ZShkYXRlX2xhYmVscyA9ICIlYiAlWSIpICsNCiAgICAgICAgICAgICAgICAgIGxhYnModGl0bGUgPSAiVVMgRnVsbHkgVmFjY2F0aW9uYXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gIkRhdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAiTnVtYmVyIG9mIFNlcmllcyBDb21wbGV0ZSAobWlsbGlvbnMpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJTb3VyY2U6IENEQyIpICsNCiAgICAgICAgICAgICAgICAgIHNjYWxlX2NvbG91cl9kaXNjcmV0ZSgiQ291bnR5IikNCg0KZ2dwbG90bHkoZmxDb21wU2VyaWVzKQ0KYGBgDQoNCiMjIEJhciBwbG90OiBCcm93YXJkIFZhY2NpbmF0aW9uIFBvcHVsYXRpb24NCmBgYHtyfQ0KIyBBbWFuZGEgSWJhcnJhDQpCcm93YXJkRnVsbHlWYWM8LWdncGxvdChCcm93YXJkVmFjLCBhZXMoeD1EYXRlLCB5PVNlcmllc19Db21wbGV0ZV9ZZXMpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgY29sb3I9ICJvcmFuZ2UiKSArIHNjYWxlX3hfZGF0ZShkYXRlX2xhYmVscyA9ICIlYiAlWSIpICsNCiAgbGFicyh0aXRsZSA9ICJCcm93YXJkIENvdW50eTogRnVsbHkgVmFjY2luYXRlZCBQb3B1bGF0aW9uIiwNCiAgICAgICAgIHggPSAiRGF0ZSIsDQogICAgICAgICB5ID0gIlNlcmllcyBDb21wbGV0ZSIsDQogICAgICAgICBzdWJ0aXRsZSA9ICJTb3VyY2U6IENEQyIpICsNCiAgc2NhbGVfY29sb3VyX2Rpc2NyZXRlKCJDb3VudHkiKQ0KZ2dwbG90bHkoQnJvd2FyZEZ1bGx5VmFjKQ0KYGBgDQoNCiMjIEJhciBwbG90OiBCcm93YXJkIFZhY2NpbmF0aW9uIDEyIFBsdXMNCmBgYHtyfQ0KIyBBbWFuZGEgSWJhcnJhDQpCcm93YXJkMTJQbHVzVmFjIDwtZ2dwbG90KEJyb3dhcmRWYWMsIGFlcyh4PURhdGUsIHk9U2VyaWVzX0NvbXBsZXRlXzEyUGx1cykpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvcj0gInJlZCIpICsgc2NhbGVfeF9kYXRlKGRhdGVfbGFiZWxzID0gIiViICVZIikgKw0KICBsYWJzKHRpdGxlID0gIkJyb3dhcmQgQ291bnR5OiBGdWxseSBWYWNjaW5hdGVkIDEyIFBsdXMgUG9wdWxhdGlvbiIsDQogICAgICAgICB4ID0gIkRhdGUiLA0KICAgICAgICAgeSA9ICJTZXJpZXMgQ29tcGxldGUiLA0KICAgICAgICAgc3VidGl0bGUgPSAiU291cmNlOiBDREMiKSArDQogIHNjYWxlX2NvbG91cl9kaXNjcmV0ZSgiQ291bnR5IikNCmdncGxvdGx5KEJyb3dhcmQxMlBsdXNWYWMpDQpgYGANCg0KIyMgQmFyIHBsb3Q6IEJyb3dhcmQgVmFjY2luYXRpb24gMTggUGx1cw0KYGBge3J9DQojIEFtYW5kYSBJYmFycmENCkJyb3dhcmQxOFBsdXNWYWMgPC1nZ3Bsb3QoQnJvd2FyZFZhYywgYWVzKHg9RGF0ZSwgeT1TZXJpZXNfQ29tcGxldGVfMThQbHVzKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yPSAiYmx1ZSIpICsgc2NhbGVfeF9kYXRlKGRhdGVfbGFiZWxzID0gIiViICVZIikgKw0KICBsYWJzKHRpdGxlID0gIkJyb3dhcmQgQ291bnR5OiBGdWxseSBWYWNjaW5hdGVkIDE4IFBsdXMgUG9wdWxhdGlvbiIsDQogICAgICAgICB4ID0gIkRhdGUiLA0KICAgICAgICAgeSA9ICJTZXJpZXMgQ29tcGxldGUiLA0KICAgICAgICAgc3VidGl0bGUgPSAiU291cmNlOiBDREMiKSArDQogIHNjYWxlX2NvbG91cl9kaXNjcmV0ZSgiQ291bnR5IikNCmdncGxvdGx5KEJyb3dhcmQxOFBsdXNWYWMpDQpgYGANCg0KIyMgQmFyIHBsb3Q6IEJyb3dhcmQgVmFjY2luYXRpb24gNjUgUGx1cw0KYGBge3J9DQojIEFtYW5kYSBJYmFycmENCkJyb3dhcmQ2NVBsdXNWYWMgPC1nZ3Bsb3QoQnJvd2FyZFZhYywgYWVzKHg9RGF0ZSwgeT1TZXJpZXNfQ29tcGxldGVfNjVQbHVzKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yPSAib3JhbmdlIikgKyAgc2NhbGVfeF9kYXRlKGRhdGVfbGFiZWxzID0gIiViICVZIikgKw0KICBsYWJzKHRpdGxlID0gIkJyb3dhcmQgQ291bnR5OiBGdWxseSBWYWNjaW5hdGVkIDY1IFBsdXMgUG9wdWxhdGlvbiIsDQogICAgICAgICB4ID0gIkRhdGUiLA0KICAgICAgICAgeSA9ICJTZXJpZXMgQ29tcGxldGUiLA0KICAgICAgICAgc3VidGl0bGUgPSAiU291cmNlOiBDREMiKSArDQogIHNjYWxlX2NvbG91cl9kaXNjcmV0ZSgiQ291bnR5IikNCmdncGxvdGx5KEJyb3dhcmQ2NVBsdXNWYWMpDQpgYGANCg0KIyMgQmFyIFBsb3Q6IENvdmlkIERlYXRocyBmb3IgU29GTCBjb3VudGllcw0KYGBge3J9DQojIE1hbnVlbGEgTW9udG95YQ0KZ2dwbG90KHNvdXRoRkxEZWF0aHMsbWFwcGluZyA9IGFlcyh5PSBgRGVhdGhzIGludm9sdmluZyBDT1ZJRC0xOWAvMTAwMCAseCA9YENvdW50eSBuYW1lYCwgZmlsbCA9IGBDb3VudHkgbmFtZWApKSArDQogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGxhYnModGl0bGUgPSAiU291dGggRmxvcmlkYTogRGVhdGhzIEludm9sdmluZyBDT1ZJRC0xOSIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgRGVhdGhzICh0aG91c2FuZHMpIiwgeCA9ICdDb3VudHkgTmFtZSAnKQ0KYGBgDQoNCiMjIE1pYW1pIHZhY2NpbmF0aW9ucyBBZ2UgMTIrDQpgYGB7cn0NCiMgTWFudWVsYSBNb250b3lhDQpBZ2UxMiA8LWdncGxvdChtaWFtaVZhY2MsIG1hcHBpbmcgPSBhZXMoeT0gU2VyaWVzX0NvbXBsZXRlXzEyUGx1cywgeCA9IERhdGUpKSArDQogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLCBjb2xvciA9ICJibHVlIikgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWIgJVkiKSArDQogIGxhYnModGl0bGUgPSAiTWlhbWkgVmFjY2luYXRpb24gTnVtYmVyczogQWdlIDEyKyIsDQogICAgICAgeSA9ICJWYWNjaW5hdGlvbiBOdW1iZXJzIiwNCiAgICAgICB4ID0gJ0RhdGUnKQ0KDQpnZ3Bsb3RseShBZ2UxMikNCmBgYA0KDQojIyBNaWFtaSB2YWNjaW5hdGlvbnMgQWdlIDE4Kw0KYGBge3J9DQojIE1hbnVlbGEgTW9udG95YQ0KQWdlMTggPC1nZ3Bsb3QobWlhbWlWYWNjLCBtYXBwaW5nID0gYWVzKHk9IFNlcmllc19Db21wbGV0ZV8xOFBsdXMsIHggPSBEYXRlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JywgY29sb3IgPSAicmVkIikgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWIgJVkiKSArDQogIGxhYnModGl0bGUgPSAiTWlhbWkgVmFjY2luYXRpb24gTnVtYmVyczogQWdlIDE4KyIsDQogICAgICAgeSA9ICJWYWNjaW5hdGlvbiBOdW1iZXJzIiwNCiAgICAgICB4ID0gJ0RhdGUnKQ0KDQpnZ3Bsb3RseShBZ2UxOCkNCmBgYA0KDQojIyBNaWFtaSB2YWNjaW5hdGlvbnMgQWdlIDY1Kw0KYGBge3J9DQojIE1hbnVlbGEgTW9udG95YQ0KQWdlNjUgPC0gZ2dwbG90KG1pYW1pVmFjYywgbWFwcGluZyA9IGFlcyh5PSBTZXJpZXNfQ29tcGxldGVfNjVQbHVzLCB4ID0gRGF0ZSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScsIGNvbG9yID0gJ29yYW5nZScpICsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfbGFiZWxzID0gIiViICVZIikgKw0KICBsYWJzKHRpdGxlID0gIk1pYW1pIFZhY2NpbmF0aW9uIE51bWJlcnM6IEFnZSA2NSsiLA0KICAgICAgIHkgPSAiVmFjY2luYXRpb24gTnVtYmVycyIsDQogICAgICAgeCA9ICdEYXRlJykNCg0KZ2dwbG90bHkoQWdlNjUpDQpgYGA=